#include <iostream>

using namespace std;

/*
 * 多态中，父类中定义的虚函数不会使用到，基本都调用子类中重写的函数内容，故可将父类中虚函数改为纯虚函数
 * 纯虚函数语法   virtual 返回值类型 函数名 (参数列表) = 0;
 *
 * 当类中有了纯虚函数，类被称为抽象类
 *  抽象类特点
 *      无法实例化对象
 *      子类必须重写抽象类中的纯虚函数，否则也属于抽象类
 */

class AbstractDrinking{
public:
    //烧水
    virtual void boil() = 0;
    //冲泡
    virtual void brew() = 0;
    //倒入杯中
    virtual void fall() = 0;
    //加配料
    virtual void addMix() = 0;
    //制作
    void make(){
        boil();
        brew();
        fall();
        addMix();
    }
};

class Coffee: public AbstractDrinking{
public:
    void boil() {
        cout << "烧水" << endl;
    }
    void brew() {
        cout << "冲泡咖啡" << endl;
    }
    void fall() {
        cout << "倒入杯中" << endl;
    }
    void addMix() {
        cout << "加糖和牛奶" << endl;
    }
};

class Tea: public AbstractDrinking{
public:
    void boil() {
        cout << "烧水" << endl;
    }
    void brew() {
        cout << "冲泡茶叶" << endl;
    }
    void fall() {
        cout << "倒入杯中" << endl;
    }
    void addMix() {
        cout << "加柠檬" << endl;
    }
};

void makeDrinking(AbstractDrinking * abstractDrinking){
    abstractDrinking->make();
    delete abstractDrinking;
}

void test01(){
    makeDrinking(new Coffee);
    makeDrinking(new Tea);

}

int main() {

    test01();

    return 0;
}
